package lc.q1_50;

/**
 * 给定一个 n × n 的二维矩阵表示一个图像。
 *
 * 将图像顺时针旋转 90 度。
 *
 * 说明：
 *
 * 你必须在原地旋转图像，这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。
 *
 */
public class Q48 {
    public void rotate(int[][] matrix) {
        // 矩阵旋转公式，int[i][j] -> int[j][len-i-1]
        // 第一轮循环(1,1) -> (1,n) -> (n,n) -> (n->1)
        // 第二轮(1,2) -> (1,n-1) -> (n-1,n) -> (n-1->1)
        // 奇数偶数怎么处理?
        int len = matrix.length;
        for (int i = 0; i * 2 < len; i++) {
            // 按圈旋转
            for (int j = 0; j < matrix[i].length / 2; j++) {
                int first = matrix[i][j];
                // 正向
                matrix[i][j] = matrix[len - j -1][i];
                matrix[len - j -1][i]=matrix[len - i -1][len - j -1];
                matrix[len - i -1][len - j -1] = matrix[j][len-i-1];
                matrix[j][len-i-1] = first;
            }
        }
    }

    public static void main(String[] args) {
        int[][] matrix = new int[][]{
                new int[]{1,2,3,4},
                new int[]{5,6,7,8},
                new int[]{9,10,11,12},
                new int[]{13,14,15,16}
        };
        Q48 q48 = new Q48();
        q48.rotate(matrix);
        for (int[] ints : matrix) {
            for (int anInt : ints) {
                System.out.print(anInt + "\t");
            }
            System.out.println();
        }
    }
}
